'use strict';

const cryptoJS = require("crypto-js");

const {
  signJwt,  // 生成jwt
  verifyJwt,  // 解密jwt
} = require('auth-token')

const WX_APPID = 'wx59bdcef2bc9d9ef0'
const WX_SECRET_KEY = 'e6ea441142b453aab8ca36c7a46b1aac'

const db = uniCloud.database();

// 生成密码
function signPassword(password) {
  const md5Hash = cryptoJS.algo.MD5.create();
  md5Hash.update(password)
  md5Hash.update('zizle')
  return md5Hash.finalize().toString();;
}

// 验证密码
function vefifyPassword(password, plainPassword) {
  return signPassword(plainPassword) == password;
}

exports.main = async (event, context) => {
  let { mobile, password } = event;
  let clientIP = context.CLIENTIP;
  let token, message, userList;
  let token_update = false;
  
  const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用，此处需要传入云函数的event和context，必传
    event,
    context
  })
  dbJQL.setUser({ // 指定后续执行操作的用户信息，此虚拟用户将同时拥有传入的uid、role、permission
    // uid: 'user-id', // 用户id
    role: ['admin'], // 指定当前执行用户的角色为admin。如果只希望指定为admin身份，可以删除uid和permission字段
    // permission: [] // 用户权限
  })
  
  switch (event.action){
    case 'tokenLogin':
      const clientToken = event.token;
      const paylod = verifyJwt(clientToken)
      if (!paylod) {
        token = ''
        message = '登录已过期，请重新登录!'
      } else  {
        // console.log('clientToken:', clientToken)
        const tokenUserRes = await dbJQL.collection('ume-user').where(`token == '${clientToken}'`).limit(1).get()
        let tokenUser = tokenUserRes.data
        if (tokenUser.length < 1) {
          token = ''
          message = '登录已失效，请重新登录!'
        } else {
          tokenUser = tokenUser[0]
          if (tokenUser._id !== paylod._id) {
            token = ''
            message = '无效用户，请重新登录!'
          } else {
            // console.log('剩余时间：', paylod.exp - new Date().getTime() / 1000)
            if (paylod.exp && paylod.exp - new Date().getTime() / 1000 < 30 * 60) {
              // 重新签发token
              token = signJwt({ '_id': tokenUser._id })
              await dbJQL.collection('ume-user').doc(tokenUser._id).update({
                token,
                last_login_date: new Date().getTime(),
                last_login_ip: clientIP
              })
              token_update = true
              message = '刷新token!'
            } else {
              token = event.token
              message = '已登录!'
            }
          }
        }
      }
      break;
    case 'phoneRegister':
      // 用户注册
      
      break;
    case 'phoneLogin':
      // 用户登录
      const dbUserRes = await dbJQL.collection('ume-user').where(`mobile == '${mobile}'`).limit(1).get()
      const userList = dbUserRes.data
      if (userList.length < 1) {
        token = '';
        message = '用户不存在!';
        // 注册逻辑开始
        // const psd = signPassword(password)
        // const resID = await dbJQL.collection('ume-user').add({
        //     // _id: '61813eafed3a9600019c960e',
        //     mobile: mobile,
        //     mp_weixin_openid: '',
        //     weixin_unionid: '',
        //     password: psd,
        //     token: ''
        // })  // 使用JQL写入
        // console.log('JQL插入:', resID)
        // token = signJwt({'_id': resID.id})
        // await dbJQL.collection('ume-user').doc(resID.id).update({
        //   token,
        //   last_login_ip: clientIP,
        //   last_login_date: new Date().getTime()
        // })
        // message = '注册成功!'
        // 注册逻辑结束
      } else {
        // 手机号密码登录,使用手机查询用户,验证密码
        const user = userList[0]
        // console.log(user.password, password)
        if (vefifyPassword(user.password, password)) {
          token = signJwt({ '_id': user._id })
          const upRes = await dbJQL.collection('ume-user').doc(user._id).update({
            token,
            last_login_date: new Date().getTime(),
            last_login_ip: clientIP
          })
          token_update = true
          message = '登录成功!'
        } else {
          token = ''
          message = '手机号或密码错误!'
        }
      }
      break;
    case 'weixinLogin':
      // 微信登录
      const wxcode = event.wxcode
      const wxapiUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${WX_APPID}&secret=${WX_SECRET_KEY}&js_code=${wxcode}&grant_type=authorization_code`
      // console.log('wxapiUrl', wxapiUrl)
      const wxLoginRes = await uniCloud.httpclient.request(
          wxapiUrl, 
          {
            method: 'GET',
            dataType: 'json'
          },
      )
      const wxloginData = wxLoginRes.data
      // console.log('wxloginData:', wxloginData)
      if (wxloginData.openid) {
        // 查询用户，有就返回token,无就添加用户
        const wxUserRes = await dbJQL.collection('ume-user').where(`mp_weixin_openid=='${wxloginData.openid}'`).limit(1).get()
        const wxUser = wxUserRes.data[0]
        // console.log('wxUserRes', wxUserRes.data)
        if (wxUser) {
          // 已存在的用户
          token = signJwt({_id: wxUser._id})
          await dbJQL.collection('ume-user').doc(wxUser._id).update({
            token,
            last_login_date: new Date().getTime(),
            last_login_ip: clientIP
          })
          
          token_update = true
          message = '微信登录成功!'
        } else {
          // 新的微信用户，注册写入数据库
          const wxAddUserRes = await dbJQL.collection('ume-user').add({
            mobile: '',
            mp_weixin_openid: wxloginData.openid,
            weixin_unionid: wxloginData.unionid,
            password: signPassword(''),
            // register_date: new Date().getTime(),
            is_admin: false,
            page_configs: {}
          })
          // console.log('wxAddUserRes', wxAddUserRes)
          // 生成token返回
          if (wxAddUserRes.id) {
            token = signJwt({_id: wxAddUserRes.id})
            message = '微信登录注册成功!'
          } else {
            token = ''
            message = wxAddUserRes.errMsg
          }
        }
      } else {
        token = ''
        message = wxloginData.errmsg
      }
      break;
    case 'tokenInfo':
      // 使用token获取用户信息
      const upayload = verifyJwt(event.token)
      if (!upayload) {
        return {
          token: '',
          message: '登录已过期，请重新登录!',
          needLogin: true
        }
      }
      const userInfoRes = await dbJQL.collection('ume-user').doc(upayload._id).get()
      // console.log('userInfo:', userInfoRes)
      const userinfo = userInfoRes.data[0]
      
      return {
        message: '查询成功!',
        info: {
          _id: userinfo._id,
          mobile: userinfo.mobile,
          page_configs: userinfo.page_configs ? userinfo.page_configs : {}
        }
      }
      break;
    default:
      token = ''
      message = '参数错误!'
      break;
  }
	
	//返回数据给客户端
	return {
    token,
    token_update,
    message,
  }
};
